home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / fsio / fsioOps.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  6KB  |  192 lines

  1. /* 
  2.  * fsIoOps.c --
  3.  *
  4.  *    Routine for initializing the operation switch table entries for 
  5.  *    local files, devices, and pipes.
  6.  *
  7.  * Copyright 1989 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifndef lint
  18. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/fsio/fsioOps.c,v 9.6 92/10/28 18:09:20 mgbaker Exp $ SPRITE (Berkeley)";
  19. #endif /* not lint */
  20.  
  21. #include <sprite.h>
  22. #include <fs.h>
  23. #include <fspdev.h>
  24. #include <fsconsist.h>
  25. #include <fsio.h>
  26. #include <fsNameOps.h>
  27. #include <fsioDevice.h>
  28. #include <fsioFile.h>
  29. #include <fsioPipe.h>
  30. #include <fsrmt.h>
  31. #include <fsdm.h>
  32. #include <fsioStreamInt.h>
  33.  
  34. /*
  35.  * The OpenOps are called to do preliminary open-time processing.  They
  36.  * are called after pathname resolution has obtained a local file I/O handle
  37.  * that represents a name of some object.  The NameOpen routine maps
  38.  * the attributes kept with the local file into an objectID (Fs_FileID)
  39.  * and any other information needed to create an I/O stream to the object.
  40.  */
  41. static Fsio_OpenOps ioOpenOps[] = { 
  42.     /*
  43.      * FILE through SYMBOLIC_LINK are all the same.
  44.      */
  45.     { FS_FILE, Fsio_FileNameOpen },
  46.     { FS_DIRECTORY, Fsio_FileNameOpen },
  47.     { FS_SYMBOLIC_LINK, Fsio_FileNameOpen },
  48.     /*
  49.      * Remote devices are opened like ordinary devices, so the old
  50.      * remote-device type is unused.
  51.      */
  52.     { FS_DEVICE, Fsio_DeviceNameOpen },
  53.     /*
  54.      * Local pipes.
  55.      */
  56.     { FS_LOCAL_PIPE, Fsio_NoProc},
  57.     /*
  58.      * Named pipes.  Unimplemented, treat like a regular file.
  59.      */
  60.     { FS_NAMED_PIPE, Fsio_FileNameOpen },
  61.     /*
  62.      * Special file type for testing new kinds of files.
  63.      */
  64.     { FS_XTRA_FILE, Fsio_FileNameOpen},
  65. };
  66. static int numIoOpenOps = sizeof(ioOpenOps)/
  67.                  sizeof(ioOpenOps[0]);
  68. /*
  69.  * Streams for Local files, device, and pipes
  70.  */
  71.  
  72. static Fsio_StreamTypeOps ioStreamOps[] = {
  73.     /*
  74.      * Top level stream.  This is created by Fs_Open and returned to clients.
  75.      * This in turn references a I/O handle of a different stream type.  The
  76.      * main reason this exists as a handle is so that it can be found
  77.      * during various cases of migration, although the reopen and scavenge
  78.      * entry points in this table are used.
  79.      */
  80.     { FSIO_STREAM, Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,/* open, read, write */
  81.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc, /* pageRead, pageWrite */
  82.         Fsio_NoProc, Fsio_NoProc,    /* iocontrol, select */
  83.         Fsio_NoProc, Fsio_NoProc,    /* getIOAttr, setIOAttr */
  84.         Fsio_NoHandle,            /* clientVerify */
  85.         Fsio_NoProc, Fsio_NoProc,    /* release, migEnd */
  86.         Fsio_NoProc,            /* migrate */
  87.         Fsio_StreamReopen,
  88.         (Boolean (*)())NIL,        /* scavenge */
  89.         Fsio_StreamClientKill,
  90.         Fsio_NoProc},            /* close */
  91.     /*
  92.      * Local file stream.  The file is on a local disk and blocks are
  93.      * cached in the block cache.  The GetIOAttr(SetIOAttr) routine
  94.      * is Fsio_NullProc because all the work of getting(setting) cached attributes
  95.      * is already done by FslclGetAttr(FslclSetAttr).
  96.      */
  97.     { FSIO_LCL_FILE_STREAM, Fsio_FileIoOpen, Fsio_FileRead, Fsio_FileWrite,
  98.         Fsio_FileRead, Fsio_FileWrite, Fsio_FileBlockCopy,
  99.                 /* Paging routines */
  100.         Fsio_FileIOControl, Fsio_FileSelect,
  101.         Fsio_NullProc, Fsio_NullProc,        /* Get/Set IO Attr */
  102.         Fsio_NoHandle, Fsio_FileMigClose, Fsio_FileMigOpen, Fsio_FileMigrate,
  103.         Fsio_FileReopen,
  104.         Fsio_FileScavenge, Fsio_FileClientKill, Fsio_FileClose},
  105.     /*
  106.      * Local device stream.  These routines branch to the device driver
  107.      * for the particular device type.
  108.      */
  109.     { FSIO_LCL_DEVICE_STREAM, Fsio_DeviceIoOpen, Fsio_DeviceRead, Fsio_DeviceWrite,
  110.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,    /* Paging routines */
  111.         Fsio_DeviceIOControl, Fsio_DeviceSelect,
  112.         Fsio_DeviceGetIOAttr, Fsio_DeviceSetIOAttr,
  113.         Fsio_NoHandle,                /* clientVerify */
  114.         Fsio_DeviceMigClose, Fsio_DeviceMigOpen, Fsio_DeviceMigrate,
  115.         Fsio_DeviceReopen,
  116.         Fsio_DeviceScavenge, Fsio_DeviceClientKill, Fsio_DeviceClose},
  117.     /*
  118.      * Local anonymous pipe stream.  
  119.      */
  120.     { FSIO_LCL_PIPE_STREAM, Fsio_NoProc, Fsio_PipeRead, Fsio_PipeWrite,
  121.         Fsio_NoProc, Fsio_NoProc, Fsio_NoProc,    /* Paging routines */
  122.         Fsio_PipeIOControl, Fsio_PipeSelect,
  123.         Fsio_PipeGetIOAttr, Fsio_PipeSetIOAttr,
  124.         Fsio_NoHandle,                /* clientVerify */
  125.         Fsio_PipeMigClose, Fsio_PipeMigOpen, Fsio_PipeMigrate,
  126.         Fsio_PipeReopen,
  127.         Fsio_PipeScavenge, Fsio_PipeClientKill, Fsio_PipeClose},
  128.  
  129. };
  130.  
  131. static int numIoStreamOps = sizeof(ioStreamOps)/
  132.                  sizeof(ioStreamOps[0]);
  133.  
  134.  
  135. /*
  136.  *----------------------------------------------------------------------
  137.  *
  138.  * Fsio_InitializeOps --
  139.  *
  140.  *    Initialize the operation switch tables for the NameOpen
  141.  *    routines and the StreamOps for local objects.
  142.  *
  143.  * Results:
  144.  *    None.
  145.  *
  146.  * Side effects:
  147.  *    Adds entries to the fsio_OpenOpTable and fsio_StreamOpTable.
  148.  *
  149.  *----------------------------------------------------------------------
  150.  */
  151.  
  152. void
  153. Fsio_InitializeOps()
  154. {
  155.     int    i;
  156.     Fsutil_BulkReopenOps    reopenOps;
  157.  
  158.     for (i = 0; i < numIoStreamOps; i++)  { 
  159.     Fsio_InstallStreamOps(ioStreamOps[i].type, &(ioStreamOps[i]));
  160.     }
  161.     for (i = 0; i < numIoOpenOps; i++)  { 
  162.     Fsio_InstallSrvOpenOp(ioOpenOps[i].type, &(ioOpenOps[i]));
  163.     }
  164.     reopenOps.setup = FsioSetupStreamReopen;
  165.     reopenOps.finish = FsioFinishStreamReopen;
  166.     Fsutil_InitBulkReopenOps(FSIO_STREAM, &reopenOps);
  167. }
  168.  
  169. /*
  170.  *----------------------------------------------------------------------
  171.  *
  172.  * Fsio_Bin() --
  173.  *
  174.  *    Setup objects to be binned.
  175.  *
  176.  * Results:
  177.  *    None.
  178.  *
  179.  * Side effects:
  180.  *    None.
  181.  *
  182.  *----------------------------------------------------------------------
  183.  */
  184.  
  185. void
  186. Fsio_Bin()
  187. {
  188.     Mem_Bin(sizeof(Fsio_FileIOHandle));
  189.     Mem_Bin(sizeof(Fsdm_FileDescriptor));
  190. }
  191.  
  192.